﻿using SWBetongXaydung.DAL;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SWBetongXaydung.BLL
{
    class DieuXeBLL
    {

        public static List<DieuXe> GetList()
        {
            throw new Exception("Chưa cài đặt");
            //return null;
        }

        public static List<DieuXe> GetList(long IDHanhTrinh, BETONGXAYDUNGEntities dbContext = null)
        {
            if (dbContext != null)
                return dbContext.DieuXeDbSet.Where(e => e.IDHanhTrinh == IDHanhTrinh).ToList();
            using (var db = DBContextHelper.GetContext())
            {
                return db.DieuXeDbSet.Where(e => e.IDHanhTrinh == IDHanhTrinh).ToList();
            }
        }

        public static List<string> GetList(int idTaiXe, BETONGXAYDUNGEntities dbContext = null)
        {
            if (dbContext != null)
                return dbContext.DieuXeDbSet.Where(e => e.IDTaiXe == idTaiXe).GroupBy(e => e.SoXe).Select(e => e.Key).ToList();
            using (var db = DBContextHelper.GetContext())
            {
                return db.DieuXeDbSet.Where(e => e.IDTaiXe == idTaiXe).GroupBy(e => e.SoXe).Select(e => e.Key).ToList();
            }
        }

        public static CODE_RESULT_RETURN Add(DieuXe dx, int dinhMucRuaXe, int dinhMucChuyenTram)
        {
            using (var db = DBContextHelper.GetContext())
            {
                if (dx.SoChuyen == 0)
                    return CODE_RESULT_RETURN.ThanhCong;
                var hanhTrinh = db.HanhTrinhDbSet.Where(e => e.IDHanhTrinh == dx.IDHanhTrinh).SingleOrDefault();
                if (hanhTrinh != null)
                {
                    var obj = db.DieuXeDbSet.Where(e => e.IDHanhTrinh == dx.IDHanhTrinh && e.SoXe == dx.SoXe && e.IDTaiXe == dx.IDTaiXe).SingleOrDefault();
                    if (obj != null)
                        return CODE_RESULT_RETURN.MaTrung;
                    else
                    {
                        db.DieuXeDbSet.Add(dx);
                        //Nếu là đi chở bê tông
                        if (dx.SoChuyen > 0 && hanhTrinh.SoPhieu > 0)
                        {
                            #region Rửa xe
                            var objHanhTrinhRuaXe = db.HanhTrinhDbSet.Where(e => e.SoPhieu == -1 && e.Ngay == hanhTrinh.Ngay).SingleOrDefault();
                            if (objHanhTrinhRuaXe != null)
                            {
                                var objRuaXe = db.DieuXeDbSet.Where(e => e.IDHanhTrinh == objHanhTrinhRuaXe.IDHanhTrinh && e.SoXe == dx.SoXe && e.IDTaiXe == dx.IDTaiXe).SingleOrDefault();
                                if (objRuaXe == null)
                                {
                                    objRuaXe = new DieuXe
                                    {
                                        IDHanhTrinh = objHanhTrinhRuaXe.IDHanhTrinh,
                                        IDTaiXe = dx.IDTaiXe,
                                        SoXe = dx.SoXe,
                                        DinhMucNhienLieu = dinhMucRuaXe,
                                        SoChuyen = 1
                                    };
                                    db.DieuXeDbSet.Add(objRuaXe);
                                }
                            }
                            #endregion

                            #region Chuyển trạm

                            var objHanhTrinhChuyenTram = db.HanhTrinhDbSet.Where(e => e.Ngay == hanhTrinh.Ngay && e.SoPhieu == -2).SingleOrDefault();
                            if (objHanhTrinhChuyenTram != null)
                            {
                                var objDieuXeChuyenTram = db.DieuXeDbSet.Where(e => e.IDHanhTrinh == objHanhTrinhChuyenTram.IDHanhTrinh &&
                                    e.SoXe == dx.SoXe && e.IDTaiXe == dx.IDTaiXe).SingleOrDefault();
                                if (objDieuXeChuyenTram == null)
                                {
                                    var xeOTram = db.DieuXeDbSet.Where(e => e.SoXe == dx.SoXe && e.HanhTrinh.SoPhieu > 0 &&
                                                                            e.IDTaiXe == dx.IDTaiXe &&
                                                                            e.HanhTrinh.Ngay <= hanhTrinh.Ngay &&
                                                                            e.IDHanhTrinh != hanhTrinh.IDHanhTrinh).OrderByDescending(e => new { e.HanhTrinh.Ngay }).ThenByDescending(e => e.HanhTrinh.SoPhieu).ToList();

                                    if (xeOTram != null && xeOTram.Count > 0)
                                    {
                                        if (xeOTram[0].HanhTrinh.IDTramCap != hanhTrinh.IDTramCap)
                                        {
                                            objDieuXeChuyenTram = new DieuXe
                                                   {
                                                       IDHanhTrinh = objHanhTrinhChuyenTram.IDHanhTrinh,
                                                       SoXe = dx.SoXe,
                                                       IDTaiXe = dx.IDTaiXe,
                                                       SoChuyen = 1,
                                                       DinhMucNhienLieu = dinhMucChuyenTram,
                                                   };
                                            db.DieuXeDbSet.Add(objDieuXeChuyenTram);
                                        }
                                    }
                                }
                            }
                            #endregion
                        }
                        db.SaveChanges();
                        return CODE_RESULT_RETURN.ThanhCong;
                    }
                }
                else
                    return CODE_RESULT_RETURN.ThatBai;
            }
        }

        public static CODE_RESULT_RETURN Update(DieuXe dx, BETONGXAYDUNGEntities dbContext = null)
        {
            BETONGXAYDUNGEntities db = null;
            if (dbContext != null)
                db = dbContext;
            else
                db = DBContextHelper.GetContext();
            var hanhTrinh = db.HanhTrinhDbSet.Where(e => e.IDHanhTrinh == dx.IDHanhTrinh).SingleOrDefault();
            if (hanhTrinh != null)
            {
                var obj = db.DieuXeDbSet.Where(e => e.ID == dx.ID).SingleOrDefault();
                if (obj != null)
                {
                    obj.IDHanhTrinh = dx.IDHanhTrinh;
                    obj.IDTaiXe = dx.IDTaiXe;
                    obj.SoXe = dx.SoXe;
                    obj.SoChuyen = dx.SoChuyen;
                    obj.DinhMucNhienLieu = dx.DinhMucNhienLieu;
                    if (obj.SoChuyen == 0)
                    {
                        db.DieuXeDbSet.Remove(obj);
                        db.SaveChanges();

                        var listDieuXeTrongNgay = db.DieuXeDbSet.Where(e => e.HanhTrinh.SoPhieu > 0 && e.HanhTrinh.Ngay == hanhTrinh.Ngay && e.IDTaiXe == dx.IDTaiXe && e.SoXe == dx.SoXe).ToList();
                        if (listDieuXeTrongNgay != null)
                        {
                            int? tsc = listDieuXeTrongNgay.Sum(e => e.SoChuyen);
                            if (tsc.HasValue && tsc.Value == 0)
                            {
                                #region Xóa rửa xe
                                var objHanhTrinhRuaXe = db.HanhTrinhDbSet.Where(e => e.Ngay == hanhTrinh.Ngay && e.SoPhieu == -1).SingleOrDefault();
                                if (objHanhTrinhRuaXe != null)
                                {
                                    var objRuaXe = db.DieuXeDbSet.Where(e => e.IDHanhTrinh == objHanhTrinhRuaXe.IDHanhTrinh && e.SoXe == dx.SoXe && e.IDTaiXe == dx.IDTaiXe).SingleOrDefault();
                                    if (objRuaXe != null)
                                        db.DieuXeDbSet.Remove(objRuaXe);
                                }
                                #endregion
                                //Xóa chuyển trạm
                                var objHanhTrinhChuyenTram = db.HanhTrinhDbSet.Where(e => e.Ngay == hanhTrinh.Ngay && e.SoPhieu == -2).SingleOrDefault();
                                if (objHanhTrinhChuyenTram != null)
                                {
                                    var objChuyenTram = db.DieuXeDbSet.Where(e => e.IDHanhTrinh == objHanhTrinhChuyenTram.IDHanhTrinh && e.SoXe == dx.SoXe && e.IDTaiXe == dx.IDTaiXe).SingleOrDefault();
                                    if (objChuyenTram != null)
                                        db.DieuXeDbSet.Remove(objChuyenTram);
                                }
                                db.SaveChanges();
                            }
                        }
                    }
                    else
                        db.SaveChanges();
                    if (dbContext == null)
                        db.Dispose();
                    return CODE_RESULT_RETURN.ThanhCong;
                }
                else
                {
                    if (dbContext == null)
                        db.Dispose();
                    return CODE_RESULT_RETURN.ThatBai;
                }
            }
            else
            {
                if (dbContext == null)
                    db.Dispose();
                return CODE_RESULT_RETURN.ThatBai;
            }
        }

        public static CODE_RESULT_RETURN Delete(long IDDieuXe, BETONGXAYDUNGEntities dbContext = null)
        {
            BETONGXAYDUNGEntities db = null;
            if (dbContext != null)
                db = dbContext;
            else
                db = DBContextHelper.GetContext();
            var obj = db.DieuXeDbSet.Where(e => e.ID == IDDieuXe).SingleOrDefault();
            if (obj != null)
            {
                db.DieuXeDbSet.Remove(obj);
                db.SaveChanges();
                if (dbContext == null)
                    db.Dispose();
                return CODE_RESULT_RETURN.ThanhCong;
            }
            else
            {
                if (dbContext == null)
                    db.Dispose();
                return CODE_RESULT_RETURN.ThatBai;
            }
        }
    }
}
